Перейти к содержанию
Fire Monkey от А до Я
  • 0

Сетка в TimageList - артефакты на картинках. Проголосуйте!


ENERGY

Вопрос

Upd:

Пожалуйста проголосуйте. Думаю это всех касается, т.к. проблема связана и с TImageList и с TImage. 

https://quality.embarcadero.com/browse/RSP-18210

 

 

Сейчас столкнулся с большой проблемой перед самым релизом для заказчика..

17 картинок, разного размера. Сейчас в TImageList  сетка рисуется постоянно при обновлении Source каждой картинки. C каждым разом становится сетка четче.  Если раньше я просто обновлял на новые картинки, и таким образом решал проблему, то сейчас после обновления source картинок сетка остается на многих картинках, причем я даже не закрываю TImageList . Только начинаю замещать одни картинки, на других появляется сетка..

И вот что теперь делать незнаю..

 

Да кстати картинки портятся и в TImage со временем в Design Time.

Сетка означает что картинку много раз масштабируют. Но почему не сохраняют оригинал, это мне не понятно..

Что тут можно придумать?

 

Delphi Berlin Update 2

Изменено пользователем ENERGY
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
5 часов назад, krapotkin сказал:

какая сетка в TImageList? как там вообще что рисуется? 

это же просто набор битмапов, из которых по запросу копируются более мелкие битмапы

Вот я сам не знаю. Этот  баг меня преследует давно. У меня кстати dpi 150% в системе (в Design time) может с этим связано? А у вас есть такой баг?

Delphi Berlin Update 2, все картинки png 24 bit

Вот скрин, и точно такая же фигня на релизе.

Вот здесь на скрине я только только обновил все картинки на новые, и линии рисуются сразу после добавления картинки на всех других. Чем больше добавляешь (обновляешь Source), тем четче становятся.

 

imagelist.png

 

@RoschinSpb Выручайте пожалуйста, что посоветуете?

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0

Вот сейчас кинул новый чистый список, решил добавить иконки только размером 48x48. Начал добавлять, и уже на 3 иконке начала появляться сетка на уже добавленных иконках. Я даже дизайнер ImageList не закрывал.

 

Я приаттачил зип файл с иконками 48x48, возможно кто-то может проверить у себя, возможно этот баг только у меня? Спасибо.

new.zip

 

Решение проблемы пока такое:

Добавляем картинки в ресурсы, и при старте в OnCreate DataModule загружаем их из ресурсов в ImageList.

 

 

unit DataModule;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, System.ImageList, FMX.ImgList,
  FMX.Graphics, System.Types, FMX.MultiResBitmap, System.UITypes;

type
  TImageListHelper = class helper for TImageList
    function Add(aBitmap: TBitmap): integer;
  end;

  TDataMod = class(TDataModule)
    StyleBook: TStyleBook;
    ImageList: TImageList;
    procedure DataModuleCreate(Sender: TObject);
  private
    procedure LoadImagesToImageList;
  public
    { Public declarations }
  end;

var
  gDataMod: TDataMod;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TDataMod.DataModuleCreate(Sender: TObject);
begin
  LoadImagesToImageList;
end;


// from resource
procedure TDataMod.LoadImagesToImageList;
var
  vBmp: TBitmap;
  i: Integer;

  procedure AddResourceToImageList(const aName: string);
  var
    vRes: TResourceStream;
  begin
    vRes := TResourceStream.Create(hInstance, aName, RT_RCDATA);
    try
      vBmp.LoadFromStream(vRes);
      ImageList.Add(vBmp);
    finally
      vRes.Free;
    end;
  end;

begin
  vBmp := TBitmap.Create;
  ImageList.BeginUpdate;
  try
    for i := 0 to 16 do
    begin
      AddResourceToImageList('i' + i.ToString);
    end;
  finally
    vBmp.Free;
    ImageList.EndUpdate;
  end;
end;

function TImageListHelper.Add(aBitmap: TBitmap): integer;
const
  SCALE = 1;
var
  vSource: TCustomSourceItem;
  vBitmapItem: TCustomBitmapItem;
  vDest: TCustomDestinationItem;
  vLayer: TLayer;
begin
  Result := -1;
  if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit;

  // add source bitmap
  vSource := Source.Add;
  vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia;
  vSource.MultiResBitmap.SizeKind := TSizeKind.Source;
  vSource.MultiResBitmap.Width := Round(aBitmap.Width / SCALE);
  vSource.MultiResBitmap.Height := Round(aBitmap.Height / SCALE);
  vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True);
  if vBitmapItem = nil then
  begin
    vBitmapItem := vSource.MultiResBitmap.Add;
    vBitmapItem.Scale := Scale;
  end;
  vBitmapItem.Bitmap.Assign(aBitmap);

  vDest := Destination.Add;
  vLayer := vDest.Layers.Add;
  vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width,
      vSource.MultiResBitmap.Height);
  vLayer.Name := vSource.Name;
  Result := vDest.Index;
end;

end.

 

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0

Если нажать Export, то в полученном файле тоже сетка будет?

Если сделать двойной клик по Selected Image, появится Multires Bitmap Editor, на нем тоже будет видна сетка?

Ссылка на комментарий
  • 0

@RoschinSpb

Может запостить баг? Или он уже есть?

 

Цитата

Да, странная картина, еще более странно, что ни кто не замечал такого поведения.

Я кстати думал что про него уже все давно знают.. Просто нет времени.. :)

Между прочим картинка  в Timage тоже портится со временем в Design Time.

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
4 часа назад, ENERGY сказал:

@RoschinSpb

Может запостить баг? 

Не может, а точно. :)

А баг не заметили потому, что проявляется далеко не на всех картинках. Как я понял только на одном, или нескольких оттенках серого (Ц).
Это на сколько я понял из-за того, что при записи TBitmap в поток и последующем восстановлении данные получаются не совсем идентичными.

Вот например если эту процедуру запускать несколько раз, то картинка становится клетчатой

procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      Bitmap.SaveToStream(Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

Вот, что у меня получилось. Вторая картинка (для сравнения) преобразуется точно также, но как видно не портится.

Demo.png.e1c4aa44aeb05dafd530dc559aef2a4c.png

Так что проблема не в TImageList и не в TImage, а где-то на более глубоком уровне. Добавляю также небольшой демо проектик. Проверял на Windows 10. Интересно что будет на других платформах.

Proj.zip

Ссылка на комментарий
  • 0

@RoschinSpb

Сетка появляется на всех картинках, без исключения, посмотрите выше, там была оранжевая картинка. Просто на цветных картинках она не сразу "проявляется", а постепенно.

Может вы запостите баг? Просто, вы лучше объясните вероятную причину этого явления, т.к. знаете этот компонент и внутренности FMX гораздо лучше меня, а мы поддержим голосами. Да и к вам будет больше доверия, т.к. вы FireMonkey разработчик, возможно баг сразу запуститься в обработку.

Картинки портятся только при работе в Design Time - так что это в любом случае касается всех платформ. В уже скомпилированной программе они вроде не портятся, если конечно не были до этого испорчены в design time, но не проверял.

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0

косяк в том что fmx сохраняет в stream в формате png, то есть все время идет перекодировка картинки. и винда видно что то косячит с альфаканалом. если сделать так 

procedure BitmapSaveToStream(bmp:TBitmap; var Stream: TMemoryStream);
var
  Surf: TBitmapSurface;
begin
  Surf := TBitmapSurface.Create;
  try
    Surf.Assign(bmp);
    TBitmapCodecManager.SaveToStream(Stream, Surf, '.wmp');
  finally
    Surf.Free;
  end;
end;


procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      BitmapSaveToStream(bitmap, Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

то все красиво. 

Ссылка на комментарий
  • 0
9 часов назад, ENERGY сказал:

@RoschinSpb

Сетка появляется на всех картинках, без исключения, посмотрите выше, там была оранжевая картинка. Просто на цветных картинках она не сразу "проявляется", а постепенно.

Не, посмотрите на картинку ниже, 120 циклов и она выглядит как живая.
На баги лучше реагируют на те, которые от официальных юзеров. На баги от работников, тем более бывших реагируют плохо.

Ссылка на комментарий
  • 0
4 часа назад, krapotkin сказал:

ну вот и ответ почему никто не сталкивался )))

сейчас все в PNG изначально картинки юзают 

Я использую только PNG и эта проблема связана именно с png картинками (с jpeg такой проблемы нет, я проверил только что).

1 час назад, RoschinSpb сказал:

На баги лучше реагируют на те, которые от официальных юзеров. На баги от работников, тем более бывших реагируют плохо.

У меня пиратка, но если вы не сможете запостить, тогда я сам отправлю.

Мне просто показалось что вы смогли бы технически лучше меня объяснить причину.

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
1 час назад, ENERGY сказал:

У меня пиратка

Про свою, я вообще молчу. :unsure:
Да технически всё понятно, при записи в поток и обратно получаются не идентичные результаты. Проявляется это в редакторе имажелиста потому, что там это происходит чаще чем везде. Там постоянно устанавливается свойство Dormant.

Ссылка на комментарий
  • 0

Проголосовал, это просто эпик!

---

Сильно подозреваю что баг не на всех компах воспроизводиться.

У меня на виртуалке воспроизводится, надеюсь и у аутсорсеров тоже воспроизведется.

Изменено пользователем Error
Ссылка на комментарий
  • 0

на андроиде не воспроизводится. было бы еще хорошо на маке проверить. мое мнение - виноват встроенный кодировщик винды который каждый раз по разному пережимает файл. 

Ссылка на комментарий
  • 0
14 часа назад, haword сказал:

на андроиде не воспроизводится. было бы еще хорошо на маке проверить. мое мнение - виноват встроенный кодировщик винды который каждый раз по разному пережимает файл. 

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

 

 

 

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
В 02.06.2017 в 22:58, ENERGY сказал:

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

 

 

 

Зря только начал с упоминания TImageList. Подозреваю, что начнут его чинить и в результате испортят.

 

Ссылка на комментарий
  • 0
В 02.06.2017 в 22:58, ENERGY сказал:

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

потому то и вылезает проблема в дизайнтайме потому что там гоняется через стрим скорее всего картинка. если починят прогон через стрим то и дизантайме все думаю наладится. 

Ссылка на комментарий
  • 0

Да, проблема в стрим. И скорее всех на уровне ОС Windows. Сама Fire Monkey не занимается кодированием-декодированием png-файлов.

procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      Bitmap.SaveToStream(Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

При однократном перекодировании артефакты практически не заметны так что на других платформах это не столь критично.

Заметно становится только при многократном перекодировании, что и происходит в IDE. Есть кто с честной версией? Может продублируете багрепорт со ссылкой на https://quality.embarcadero.com/browse/RSP-18210.

Ссылка на комментарий
  • 0

Если я правильно понял, то таких багов уже зарепортена толпа. Начиная от того, что каждое сохранение формы со StyleManager (даже если на форме вообще ничего не трогали) приводит к практически полному изменению картинок в стиле. В любой системе контроля версий это видно великолепно. Задалбывает каждый раз выборочно ревертить изменения.

Ссылка на комментарий
  • 0
15 часов назад, kami сказал:

Если я правильно понял, то таких багов уже зарепортена толпа. Начиная от того, что каждое сохранение формы со StyleManager (даже если на форме вообще ничего не трогали) приводит к практически полному изменению картинок в стиле. В любой системе контроля версий это видно великолепно. Задалбывает каждый раз выборочно ревертить изменения.

Картинки меняются даже в Delphi 6 (не XE6), но вот заметных артефактов не наблюдается.

Ссылка на комментарий
  • 0
2 минуты назад, kami сказал:

Не знаю... ни в D7, ни в D2010 не  сталкивался с изменением dfm-ок в плане картинок. В том числе - в ImageList.

потому что там картинки хранятся так как есть, то есть в каком формате закинули на форму, и если timage понимает его, то в таком формате оно и будет лежать. в fmx я так понимаю, все преобразовывается в png при перемещении через стрим. то есть не помещается то что было в стрим а с начало преобразовывается в png, потом заливается в стрим, потом читается от туда и располагается на форме. я подозреваю сделали это для того что бы сохранять прозрачность изображений. идея то в принципе верная НО кто же знал что винда косячит. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...